﻿/* Autor: Achim Schnell */

using System;

namespace AppFx.ComponentModel
{
	/// <summary>
	/// Ein Attribut, dass angibt, dass ein Member zur Entwurfszeit eingeschlossen wird (abweichend vom Standard) - oder auch nicht.
	/// </summary>
	[AttributeUsage(AttributeTargets.All)]
	public class IncludeAttribute : Attribute
	{
		#region Statics

		/// <summary>Gibt an, dass eine Eigenschaft oder ein Ereignis zur Entwurfszeit eingeschlossen ist. Dieses static-Feld ist schreibgeschützt.</summary>
		public static readonly IncludeAttribute Yes = new IncludeAttribute(true);
		/// <summary>Gibt an, dass eine Eigenschaft oder ein Ereignis zur Entwurfszeit nicht eingeschlossen ist. Dieses static-Feld ist schreibgeschützt.</summary>
		public static readonly IncludeAttribute No = new IncludeAttribute(false);
		/// <summary>Gibt den Standardwert für das <see cref="T:AppFx.ComponentModel.IncludeAttribute" /> an, der <see cref="F:AppFx.ComponentModel.IncludeAttribute.Yes" /> ist. Dieses static-Feld ist schreibgeschützt.</summary>
		public static readonly IncludeAttribute Default = IncludeAttribute.Yes;

		#endregion

		#region Fields

		private bool include = true;

		#endregion

		#region Properties

		/// <summary>Ruft einen Wert ab, der angibt, ob ein Objekt versteckt ist.</summary>
		/// <returns>true, wenn das Objekt versteckt ist, andernfalls false.</returns>
		public bool Include
		{
			get
			{
				return this.include;
			}
		}

		#endregion

		#region Constructors

		/// <summary>Initialisiert eine neue Instanz der <see cref="T:AppFx.ComponentModel.IncludeAttribute/>-Klasse.</summary>
		/// <param name="include">true, wenn eine Eigenschaft oder ein Ereignis zur Entwurfszeit eingeschlossen ist, andernfalls false. Der Standardwert ist true.</param>
		public IncludeAttribute(bool include)
		{
			this.include = include;
		}

		#endregion

		#region Methods

		/// <summary>Gibt an, ob diese Instanz und ein angegebenes Objekt gleich sind.</summary>
		/// <returns>true, wenn <paramref name="obj" /> gleich dieser Instanz ist, andernfalls false.</returns>
		/// <param name="obj">Ein weiteres Objekt für den Vergleich. </param>
		public override bool Equals(object obj)
		{
			if (obj == this)
			{
				return true;
			}
			IncludeAttribute browsableAttribute = obj as IncludeAttribute;
			return browsableAttribute != null && browsableAttribute.include == this.include;
		}
		/// <summary>Gibt den Hashcode für diese Instanz zurück.</summary>
		/// <returns>Ein 32-Bit-Ganzzahl-Hashcode mit Vorzeichen.</returns>
		public override int GetHashCode()
		{
			return this.include.GetHashCode();
		}
		/// <summary>Bestimmt, ob dieses Attribut der Standardwert ist.</summary>
		/// <returns>true, wenn das Attribut der Standardwert für diese Attributklasse ist, andernfalls false.</returns>
		public override bool IsDefaultAttribute()
		{
			return this.Equals(IncludeAttribute.Default);
		}

		#endregion
	}
}
